About CDRs Sent by ARM to CDR Server

ARM Routers send CDRs (Call Detail Records) to a CDR Server. CDR messages contain information about all calls routed by the ARM, for example, source and destination users, call duration and call path. CDR messages also provide billing details. CDRs are sent as syslog packets to a predefined IP address configured by the operator. CDR syslog messages comply with RFC 3164 and are identified by Facility 17 (local1) and Severity 6 (Informational). CDR messages are built using getRoute and CallStatus_callEnd messages, by the first node in the paths. CDR types are CALL_START and CALL_END.

Calls from an SBC node:

1. One CALL_START message is sent per route (path)
2. Two CALL_END messages are sent at the end of the call

Calls from a gateway node:

1. One CALL_START message is sent per route (path)
2. One CALL_END message is sent at the end of the call (not per route)

SessionId is identical for all CDR messages related to the same call.

The routeSeq:

1. Represents the route (path) the ARM attempts
2. The count starts from 0
3. For example, for an SBC call, when there are three paths to attempt, the ARM sends:
a. First route (path): One CALL_START message and one CALL_END (outgoing leg) message. routeSeq = 0.
b. Second route (path): One CALL_START message and one CALL_END (outgoing leg) message. routeSeq = 1.
c. Third route (path): One CALL_START and two CALL_END (incoming and outgoing legs) messages. routeSeq = 2.

The following table describes all CDR fields.

CDR Field Descriptions

CDR Field

Description

CDR Report Type

Format

RouterIp

IP address of the Router that sends the CDR.

All

String

(15)

Seq

Each router sends its own sequence CDR staring with 1.

All

String

(10)

CreationDate

The creation date of the CDR.

All

String

(40)

CdrReportType

Report type:

"CALL_START": CDR is sent upon an getRoute message on the first node.
"CALL_END": CDR is sent upon a CALL_STATUS_END_CALL message from the node.

-

String

(13)

AppType

Endpoint type:

"SBC”
“GW”
“HYBRID”
“THIRD_PARTY”

All

String

(13)

SessionId

Unique Session ID

All

String (20)

callId

CallId of the relevant leg

"CALL_START" – incoming leg.

"CALL_END" – both legs.

String

(55)

direction

Direction of the call:

Incoming or Outgoing

"CALL_START"

String (10)

pconOrConnectionName

Pcon or connection name

All

String

(35)

nodeId

ARM node database ID address

All

String (11)

nodeName

Node name as described in the GUI

All

String (25)

nodeIp

Node IP address

All

String (20)

pconId

Pcon database ID

"CALL_START"

String (10)

conId

Connection database ID

"CALL_START"

String (10)

pconOrConnectionType

Pcon or connection type

"CALL_START"

String (25)

outPconId

Outgoing Peer Connection database ID

"CALL_START"

String (10)

outConId

Outgoing Connection database ID

"CALL_START"

String (10)

outPconOrConType

Outgoing leg type

"CALL_START"

String (25)

lastNodeId

ID of the last node

"CALL_START"

String (10)

lastNodeName

Name of the last node

"CALL_START"

String (25)

lastPconId

ID of the last Peer Connection

"CALL_START"

String (10)

lastPconName

Name of the last Peer Connection

"CALL_START"

String (35)

srcUri

Source URI as actually sent (after manipulation).

All

String (50)

srcUriBeforeMap

Source before manipulation.

"CALL_START"

String (50)

from

From URI as actually sent (after manipulation).

"CALL_START"

String (50)

fromBeforeMap

From URI before manipulation.

"CALL_START"

String (50)

pai

P-Asserted-Identity URI as actually sent (after manipulation).

"CALL_START"

String (50)

paiBeforeMap

P-Asserted-Identity URI before manipulation.

"CALL_START"

String (50)

ppi

P-Preferred-Identity URI as actually sent (after manipulation).

"CALL_START"

String (50)

ppiBeforeMap

P-Preferred-Identity URI before manipulation.

"CALL_START"

String (50)

dstUri

Destination URI as actually sent (after manipulation).

All

String (50)

dstUriBeforeMap

Destination before manipulation.

"CALL_START"

String (50)

armSetupTime

ARM Router time when sending CALL_START.

"CALL_START"

String (30)

armReleaseTime

ARM Router time when sending CALL_END.

"CALL_END"

String (30)

sbcSetupTime

Gateway / SBC time when start handling Invite message.

"CALL_END"

String (40)

sbcConnectTime

Gateway / SBC time when 200 OK response (i.e., call is established)

"CALL_END"

String (40)

sbcReleaseTime

Gateway / SBC time when a BYE message (i.e., call ends)

"CALL_END"

String (40)

sbcAlertTime

Gateway / SBC time when start ringing

"CALL_END"

String (40)

alertDuration

Time of ringing in milliseconds (should be configured in the SBC /gateway to send in milliseconds)

"CALL_END"

String (13)

voiceDuration

Time of voice streamed in milliseconds (should be configured in the SBC /Gateway to send in milliseconds)

"CALL_END"

String (13)

completeDuration

Time of the whole call in milliseconds (from the first incoming Invite until ending the call)

"CALL_END"

String (16)

sipTerminationReason

SIP termination reason

"CALL_END"

String (20)

sipTerminationReasonDesc

SIP termination reason – more detailed

"CALL_END"

String (35)

routeSeq

Each route (path) of a call has a number. Starting from 0.

"CALL_START"

String (8)

sipInterface

sipInterface ID of the Connection or Peer Connection in the SBC / Gateway

"CALL_START"

String (20)

legId

Leg id of the SBC / Gateway

"CALL_END"

String (11)

routingRuleId

The Routing Rule ID of the match rule

"CALL_START"

String (13)

routingRuleName

The Routing Rule name of the match rule

"CALL_START"

String (30)

discardingByRoutingRule

The Routing Rule ID in case of discarding rule

"CALL_START"

String (24)

continueWithNodeInternalTablesByRoutingRule

Stop ARM routing and continue with node’s internal routing

"CALL_ START"

String (44)

fork

Is a fork call

"CALL_ START"

String (5)

Path

String – describes the path.

"CALL_START"

String (200)

Two CDR format options are available:

Clear text (separating each value with “|”)
As JSON

Here's an example of an ARM signaling CDR as clear text, sent at the end of a call (which was terminated normally):

Format:

|routerIp|seq|creationDate|cdrReportType|appType|sessionId|callId|direction
|pconOrConName |nodeId|nodeName|nodeIp|pconId|conId|pconOrConType|sipInterface
|outPconId|outConId|outPconOrConType|lastPconId|lastNodeId|lastNodeName |lastPconName|srcUri|srcUriBeforeMap|from|fromBeforeMap|pai|paiBeforeMap
|ppi|ppiBeforeMap|dstUri|dstUriBeforeMap|armSetupTime|armReleaseTime
|sbcSetupTime |sbcConnectTime|sbcReleaseTime|sbcAlertTime|alertDuration
|voiceDuration |completeDuration|sipTerminationReason|sipTerminationReasonDesc|routeSeq |legId|routingRuleId|routingRuleName|discardingByRoutingRule
|continueWithNodeInternalTablesByRoutingRule |fork |path

Value:

|10.7.6.102|4|2020-12-06T09:21:23.729Z|CALL_START|SBC|33a4b1cfb37733a5
|1-24960@10.7.20.148|RMT|SIPP|1|SBC_102|10.7.12.102|70|null|IPGroup|SIPP|null
|1|IPGroup|71|3|Hybrid_96|SIPP |401@10.7.20.148 |123456@10.7.20.148|||||||sipp201@10.7.12.102 |sipp201@10.7.12.102 |2020-12-06T09:21:23.728Z|||||| |0||| |0 |-1 |47 |src_uri |-1|-1|false|IncomingLeg=[nodeId=1,nodeName=SBC_102,pconId=70,pconOrConnectionName=SIPP], Outgoing Leg=[nodeId=3,nodeName=Hybrid_96,pconId=71,pconOrConnectionName=SIPP], Edges=[Edge [connSrcNode=1, connDestNode=5, connectionId=1], Edge [connSrcNode=5, connDestNode=3, connectionId=2]]]

Here's an example of an ARM signaling CDR as JSON, sent at the end of a call (that was terminated normally):

jsonCdr={"creationDate":"2020-12-06T09:21:23.729Z","sessionKey":"1_33a4b1cfb37733a5","routerIp":"10.7.6.102","routerId":10,"seq":4,"cdrReportType":"CALL_START","cdrApplicationType":"SBC","sessionId":"33a4b1cfb37733a5","callId":"1-24960@10.7.20.148","callOrig":"RMT","pconOrConName":"SIPP","nodeId":"1",
"nodeName":"SBC102","nodeIp":"10.7.12.102","pconId":70,"conId":null,
"pconOrConType":"IPGroup","sipInterface":"SIPP","outPconId":null,"outConId":1,
"outPconOrConType":"IPGroup","lastPconId":71,"lastNodeId":3,
"lastNodeName":"Hybrid96","lastPconName":"SIPP","srcUri":"401@10.7.20.148",
"srcUriBeforeMap":"123456@10.7.20.148","from":"","fromBeforeMap":"","pai":"",
"paiBeforeMap":"","ppi":"","ppiBeforeMap":"","dstUri":"sipp201@10.7.12.102",
"dstUriBeforeMap":"sipp201@10.7.12.102","armSetupTime":"2020-12-06T09:21:23.728Z",
"armReleaseTime":"","sbcSetupTime":"","sbcConnectTime":"","sbcReleaseTime":"",
"sbcAlertTime":"","alertDuration":"","voiceDuration":"0","completeDuration":"",
"sipTerminationReason":"","sipTerminationReasonDesc":"","routeSeq":0,"legId":-1,"routingRuleId":47,"routingRuleName":"src_uri","path":"Incoming Leg=[nodeId=1,nodeName=SBC_102,pconId=70,pconOrConnectionName=SIPP], Outgoing Leg=[nodeId=3,nodeName=Hybrid_96,pconId=71,pconOrConnectionName=SIPP], Edges=[Edge [connSrcNode=1, connDestNode=5, connectionId=1], Edge [connSrcNode=5, connDestNode=3, connectionId=2]]]","discardingByRoutingRule":-1, "continueWithNodeInternalTablesByRoutingRule":-1,"fork":false,"httpResponse":200,"description":""}